//package net.lab1024.sa.gateway.processor;
//
//import lombok.AllArgsConstructor;
//import lombok.Getter;
//import lombok.extern.slf4j.Slf4j;
//import net.lab1024.sa.gateway.dto.ApiProcessDTO;
//import net.lab1024.sa.gateway.dto.HttpRequestDTO;
//import org.apache.dubbo.config.ReferenceConfig;
//import org.apache.dubbo.config.RegistryConfig;
//import org.apache.dubbo.config.utils.SimpleReferenceCache;
//import org.apache.dubbo.rpc.service.GenericService;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//import reactor.core.publisher.Mono;
//
//import java.util.Map;
//
///**
// * Dubbo 协议处理器：通过 Dubbo 泛化调用动态调用后端 Dubbo 服务
// */
//@Slf4j
//@Component
//public class DubboProcessor implements IProcessor {
//
//    @Value("${dubbo.registry.address}")
//    private String registryAddress;
//
//    @Override
//    public Mono<Object> process(ApiProcessDTO dto) {
//        HttpRequestDTO requestDTO = dto.getHttpRequest();
//        try {
//            // 从请求中解析 Dubbo 服务信息（假设通过 URI 或请求参数传递）
//            DubboServiceMeta meta = parseDubboServiceMeta(requestDTO);
//
//            // 获取泛化调用服务实例
//            GenericService genericService = getGenericService(meta);
//
//            // 调用 Dubbo 服务（同步调用，可改为异步）
//            Object result = genericService.$invoke(
//                    meta.getMethodName(), // 方法名
//                    meta.getParamTypes(), // 参数类型数组（如 String.class.getName()）
//                    meta.getParams()      // 参数值数组
//            );
//
//            return Mono.just(result); // 包装为响应式流返回
//        } catch (Exception e) {
//            return Mono.error(new RuntimeException("Dubbo service call failed: " + e.getMessage()));
//        }
//    }
//
//    /**
//     * 解析 Dubbo 服务元数据（服务名、方法名、参数等）
//     * 假设请求体为 JSON：{"serviceName":"com.wps.order.service.OrderService","methodName":"create","paramTypes":["java.lang.String"],"params":["123"]}
//     */
//    private DubboServiceMeta parseDubboServiceMeta(HttpRequestDTO requestDTO) {
//        Map<String, Object> body = (Map<String, Object>) requestDTO.getBody();
//        return new DubboServiceMeta(
//                (String) body.get("serviceName"), // 服务接口名（如 com.wps.order.service.OrderService）
//                (String) body.get("methodName"),  // 方法名（如 create）
//                (String[]) body.get("paramTypes"), // 参数类型数组（如 ["java.lang.String"]）
//                (Object[]) body.get("params")      // 参数值数组（如 ["123"]）
//        );
//    }
//
//    /**
//     * 获取 Dubbo 泛化调用服务实例（通过 ReferenceConfig 缓存）
//     */
//    private GenericService getGenericService(DubboServiceMeta meta) {
//        ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
//        reference.setInterface(meta.getServiceName()); // 服务接口名
//        reference.setRegistry(new RegistryConfig(registryAddress));// 注册中心地址
//        reference.setGeneric(Boolean.TRUE.toString()); // 启用泛化调用
//        reference.setTimeout(3000);                    // 超时时间（毫秒）
//
//        // 使用 Dubbo 缓存避免重复创建 ReferenceConfig
//        SimpleReferenceCache cache = SimpleReferenceCache.getCache();
//        return cache.get(reference);
//    }
//
//    /**
//     * Dubbo 服务元数据封装类
//     */
//    @Getter
//    @AllArgsConstructor
//    private static class DubboServiceMeta {
//        private final String serviceName; // 服务接口名
//        private final String methodName;  // 方法名
//        private final String[] paramTypes; // 参数类型数组
//        private final Object[] params;     // 参数值数组
//    }
//}